#ifndef CPU_H
#define CPU_H

#include <QList>
#include <QString>
#include <QMultiMap>
#include <QPair>
#include <string>
using namespace std;

#include "measure.h"

class CPU : public Measure
{
public:
    CPU();
    ~CPU();

    struct CpuStatusTime{
        QString user;    //normal进程以user模式运行的总时间
        QString nice;    //niced进程以user模式运行的总时间
        QString sys;     //进程以kernel模式运行的总时间
        QString idle;    //除硬盘IO等待时间以外其它等待时间
        QString ioWait;  //硬盘IO等待时间
        QString irq;     //硬中断时间
        QString softIrq; //软中断时间
        QString currentUsage;//当前CPU使用率
    }sStatus;

    struct CpuItemFromCommand{
        QString intr;    //第一个为自系统启动以来，发生的所有的中断的次数()// vmstat (in
        QString ctxt;    //自系统启动以来CPU发生的上下文交换的次数       //vmstat (cs
        QString running; //当前运行队列的任务的数目         // vmstat (r
        QString blocked; //当前被阻塞的任务的数目           // vmstat (b
    }sItems;

    struct CpuLoadavg{
        QString mins1;   //1min前CPU平均使用率
        QString mins5;   //5min前CPU平均使用率
        QString mins15;  //15min前CPU平均使用率
    }sLoad;

    //将从stat和loadavg获得的信息存放在一起
    void GetCPUInfo(CPU *pCPU, QMultiMap<QString, QPair<QString,QString> > *pmultiMap);
private:
    //
    // 从/proc/stat文件中获取CPU信息
    void GetCPUFromStat(struct CpuStatusTime *pStatusTime);
    // 从/proc/loadavg文件中获取CPU信息
    void GetCPUFromLoadavg(struct CpuLoadavg *pLoadavg);
    //
    void GetCPUFromCommand(struct CpuItemFromCommand *pItemFromCommand);
    //
    void SeperateString(char *result,struct CpuItemFromCommand *pItemFromCommand);
    //


    char *cpuStat;
    char *cpuLoadavg;

    int index;  // 标记当前CpuStatusTime对象
    string stat[2][8]; // 用于保存从stat读取的数据

};

#endif // CPU_H
